package main

import "fmt"

// 依赖注入

/*
	不通过 new() 的方式在类内部创建依赖类对象，而是将依赖的类对象在外部创建好之后，通过构造函数、函数参数等方式传递
（或注入）给类使用。

Notification 类负责消息推送，
依赖MessageSender 类（接口）实现推送商品促销、验证码等消息给用户。
 */

type Notification struct {
	messageSender MessageSender
}

// 构造函数
func NewNotifycation(messageSender MessageSender)Notification{
	return Notification{
		messageSender: messageSender,
	}
}

func (this Notification)SendMessage(cellphone,message string){
	this.messageSender.send(cellphone,message)
}

type MessageSender interface {
	send(cellphone,message string)
}

// 发送不同类型的信息

// 短信发送类
type SmsSender struct {
	
}
func NewSmsSendr()SmsSender{
	return SmsSender{}
}
func (this SmsSender)send(cellphone,message string){
	fmt.Printf("短信发送消息: 手机号是%s 消息是%s\n",cellphone,message)
}

// 站内信发送类
type InboxSender struct {
	
}

func (this InboxSender)send(cellphone,message string){
	fmt.Printf("站内信发送消息: 手机号是%s 消息是%s\n",cellphone,message)
}

func main()  {
	sendr := NewSmsSendr()
	notifycation := NewNotifycation(sendr)
	notifycation.SendMessage("1111","有内鬼 停止交易")
}